#include <stdio.h>
#include <stdlib.h>

//条件编译
//常用与调试，多平台程序编译 
//  #if constant-expression 
//          statements
//  #endif
//constant-expression由预处理器进行求值，如果它的值是非零值，则整体长编译 

#define ON 1
#define OFF 0

#define WINDOWS OFF
#define LINUX OFF
#define IOS OFF
#define ANDROID ON

//#ifdef
//#ifndef 
#define DEBUG

//测试宏是否被定义 
//defined(symbol)，定义则返回1 
//!defined(symbol) ，判断未定义
#if defined(DEBUG)
    #undef DEBUG   //定义了，则移除该宏 
#else
    #define DEBUG  //未定义，则定义该宏 
#endif


int main(int argc, char *argv[]) 
{
	demo1:
	{
		//#if，如果宏的值非零（真），那么就编译该部分代码
		//#elif同#if 
	    #if WINDOWS
	        printf("Windows\n");
	    #elif LINUX
	        printf("Linux %d\n");
	    #elif IOS
	        printf("IOS\n");
	    #elif ANDROID
	        printf("Android\n");
	    #else
	        printf("Other OS\n");
	    #endif
    }
    
    demo2:
    {
	    //#ifdef，如果定义了该宏，则编译该部分代码 
	    #ifdef DEBUG
	        printf("Debug\n");
	    #endif
	    
	    //#ifndef，如果没有定义该宏，则编译该部分代码 
	    #ifndef DEBUG
	        printf("No Debug\n");
	    #endif
    }
    
    demo3:
    {
    	#if defined(DEBUG)
    	    printf("Debug be defined %d\n", defined(DEBUG));  //这里使用defined(DEBUG)并没有报错，因为这一段代码没有被编译 
    	#endif
    	
    	#if !defined(DEBUG)
    	    printf("Debug be not defiend\n");
    	#endif
	}
	return 0;
}

//总结
/*********************************** 
*1、#if的功能比#ifdef/#ifndef的功能更强大，因为#if支持表达式形式
*2、defined(symbol)和!defined(symbol)用来检测一个宏是否被定义
*3、条件编译在防止头文件重复包含的技巧中十分重要
************************************/ 
